package rw.input;

import java.util.LinkedList;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 帧同步信号函数
 *
 * @author RWdaze
 */
public class SynchronizedSign extends Thread {
    /**
     * 动作列表。每一帧需要执行的方法都放在这里，发出信号时，就依次执行它们
     */
    public LinkedList<Action> acts = new LinkedList<>();

    /**
     * 每一帧刷新的等待时间
     */
    private static final int DELAY = 16;

    /**
     * 单例模式
     */
    private static SynchronizedSign instance;

    public static SynchronizedSign getInstance() {
        if (instance == null) {
            instance = new SynchronizedSign();
        }
        return instance;
    }

    private SynchronizedSign() {

    }

    /**
     * 为了update信号量而设置的同步锁
     */
    private final Object lock = false;

    /**
     * 信号量
     */
    private boolean update = false;

    @Override
    public void run() {
        //开启一个线程，每16毫秒把信号量设置为true
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                synchronized (lock) {
                    update = true;
                    lock.notify();
                }
            }
        }, 0, DELAY);

        // 当信号量为true时，执行所有acts中的操作，
        // 如果信号量为false，则休眠到为true为止
        while (true) {
            synchronized (lock) {
                if (!update) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        break;
                    }
                }
                update = false;
            }
            action();
        }
    }

    /**
     * 执行所有动作
     */
    private void action() {
        for (Action action : acts) {
            action.apply();
        }
    }
}